/*
锯齿矩阵是指每一行包含的元素个数不相同的矩阵，比如:

3 5 2 6 1
2 3 4
1 6 2 7

读入若干对整数(x,y) ,表示在第x行的末尾加上一个元素y。输出最终的锯齿数组。初始时矩阵为空。
Input
多组输入（不超过100组）
第一行输入两个整数n，m(1≤n,m≤10000)，其中n表示锯齿数组的行数，m表示插入的元素总数。
接下来一共m行，每行两个整数x,y(1≤x≤n,0≤y≤10000) ，表示在第x行的末尾插入一个元素y。
Output
对于每组数据，输出n行
每行若干个用空格分隔的整数（末尾没有空格）。如果某行没有任何元素，则输出一个空行。
Sample Input
3 12
1 3
2 2
2 3
2 4
3 1
3 6
1 5
1 2
1 6
3 2
3 7
1 1
Sample Output
3 5 2 6 1
2 3 4
1 6 2 7
*/
#include <bits/stdc++.h>
using namespace std;
const int MAX = 10001;
vector<int> a[MAX];
int n, m, x, y;
int main()
{
    ios::sync_with_stdio(false); //cin读取数据不加会超时
    int i, j;
    while (cin >> n >> m) // n=锯齿数组的行数，m=元素总数
    {
        for (i = 1; i <= n; i++)
        {
            a[i].clear(); //清空vector
        }
        for (i = 1; i <= m; i++)
        {
            cin >> x >> y;
            a[x].push_back(y);
        }
        for (i = 1; i <= n;i++)
        {
            for(j=0;j<a[i].size();j++)
             {
                 if(j==a[i].size()-1) //不能用cout，否则超时
                     printf("%d",a[i][j]); // 最后一个不输出空格
                 else
                     printf("%d ",a[i][j]);
             }
             printf("\n");
        }
    }
    return 0;
}